[1] 5
[1] 6
[1] 15
[1] 5
[1] 0
Crear código en R, uso colaborativo y reproducible
¿Quiénes somos?
Lunes = introducción a R, crear código, buenas prácticas
Martes = manejo y visualizacion de datos
Miércoles = modelos lineales y factoriales
Jueves = modelos generalizados y multivariantes
Viernes = uso colaborativo, dudas, ejemplos
Mejorar la comprensión y la práctica estadística.
Desarrollar habilidades en programación en R.
Aprender flujos de trabajo eficientes, limpios y reproducibles.
Saber buscar información
No enredarse en errores
A programar en plan pro sin mirar internet o chatgpt
A hacer páginas web
A dejar de pelearte con la estadística
WordCloud de la encuesta de este curso
R es un lenguaje y entorno de programación especializado en:
Biólogxs en general
R → Es el lenguaje de programación y el motor que realiza los cálculos estadísticos y el análisis de datos.
RStudio → Es un entorno de desarrollo integrado (un “programa”) que facilita el uso de R con una interfaz amigable, con paneles, autocompletado y herramientas visuales.
Ejemplo mesa de trabajo en R studio
📠 Se hacen operaciones aritméticas (como una calculadora): multiplicar, dividir, sumar, restar…
Utilizamos la almohadilla # para silenciar o para comentar
Las operaciones lógicas comparan valores y devuelven un resultado lógico.
TRUE o FALSE
[1] FALSE
[1] FALSE
[1] TRUE
TRUE se comporta como 1 y FALSE como 0.
Se pueden usar en cálculos.
La magia de los objetos
Hay muchos tipos de objetos, se asignan con “<-”
Cambiar de un tipo a otro con as.factor(), as.numeric(), as.character()
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
[1] 1 2 3 4 5 6 7 8 9 10
Ya iremos viendo más ejemplos…
Vectores: elementos del mismo tipo juntos (numérico, carácter, etc.)
(como una columna de una tabla…)
[1] 1 2 3 4 6
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
Genera de dos maneras distintas un vector de números que vayan del 1 al 10
Genera de dos maneras distintas un vector de números que vayan del 1 al 10
Se pueden hacer medias, multiplicaciones de objetos, seleccionar parte de un vector, etc
[1] 3.2
[1] 3.2 6.4 9.6 12.8 19.2
[1] 1.00000000 1.00000000 1.00000000 1.00000000 1.20000000 0.16666667
[7] 0.28571429 0.37500000 0.44444444 0.60000000 0.09090909 0.16666667
[13] 0.23076923 0.28571429 0.40000000 0.06250000 0.11764706 0.16666667
[19] 0.21052632 0.30000000 0.04761905 0.09090909 0.13043478 0.16666667
[25] 0.24000000 0.03846154 0.07407407 0.10714286 0.13793103 0.20000000
[31] 0.03225806 0.06250000 0.09090909 0.11764706 0.17142857 0.02777778
[37] 0.05405405 0.07894737 0.10256410 0.15000000
[1] 0.2857143
Las funciones son aplicaciones que nos permiten realizar operaciones muy diversas.
Hay funciones ya de base de R (baseR) o en los paquetes ya creados por los usuarios (dplyr)
Las funciones son aplicaciones que nos permiten realizar operaciones muy diversas.
[1] 7.714286
[1] 8
[1] 3.59232
[1] 3
[1] 12
[1] 3 12
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.000 5.000 8.000 7.714 10.500 12.000
Ayuda para funciones en R (o también vale buscar en google “function mean in R”)
Gato de Shrek
Aleatoriedad, ordenar, contar…
[1] 11 7 5
[1] 11 5 6 7 5 11 10 7
[1] 5 5 6 7 7 10 11 11
[1] 8
Conteos y valores únicos
Raiz cuadrada, logaritmo, etc
[1] 1.945910 2.302585 2.397895 1.609438 1.945910 1.791759 1.609438 2.397895
[1] 2.645751 3.162278 3.316625 2.236068 2.645751 2.449490 2.236068 3.316625
[1] 0.8450980 1.0000000 1.0413927 0.6989700 0.8450980 0.7781513 0.6989700
[8] 1.0413927
[1] 2401 10000 14641 625 2401 1296 625 14641
[1] 0.23
[1] 0.12
R es muy potente generando distribuciones con funciones ya integradas.
Una distribución describe cómo se reparten los valores de una variable, cómo de frecuentes son.
Números al azar → todos con la misma probabilidad
[1] 0.3375002 0.8853313 0.3657060 0.9562944 0.1337862
Peso de personas → muchas alrededor del promedio (forma de campana)
[1] 1.6165807 0.5592948 -1.4885733 0.3533867
Datos de conteo → número de especies
[1] 3 3 3 0 2
Resultados de “éxito o fracaso” (como lanzar una moneda)
# Binomial
# 20 experimentos, en cada uno lanzamos una monedas, con una probabilidad de que salga cara del 50%
caras <- rbinom(200, size = 1, prob = 0.5)
table(caras)caras
0 1
99 101
R trabaja muy bien con cadenas de texto (strings)
un_nombre <- "Laura" # caracter
nombres <- c("Laura", "Rocio", "Violeta", "Rocio", "Rocio") # string
unique (nombres)[1] "Laura" "Rocio" "Violeta"
nombres
Laura Rocio Violeta
1 3 1
[1] "Laura" "Rocio" "Violeta" "Rocio" "Rocio" "Laura" "Rocio"
[8] "Violeta" "Rocio" "Rocio" "Laura" "Rocio" "Violeta" "Rocio"
[15] "Rocio" "Laura" "Rocio" "Violeta" "Rocio" "Rocio" "Laura"
[22] "Rocio" "Violeta" "Rocio" "Rocio"
[1] "Rocio" "Rocio" "Rocio"
Operaciones lógicas
[1] TRUE FALSE FALSE FALSE FALSE
[1] FALSE TRUE TRUE TRUE TRUE
[1] TRUE TRUE FALSE TRUE FALSE
[1] TRUE TRUE FALSE TRUE TRUE
Calcula el minimo valor de 100 valores aleatorios según una distribución normal
Dada una secuencia de 20 números seguidos (del 0 al 20), genera los pares y guárdalo en un objeto.
Ejercicio
[1] 29.11862
[1] 12.21208
Sirven para ejecutar una tarea compleja y personalizada
Ventajas:
Creamos nuestras propias funciones con function ()
Muchas ejecuciones (i.e. tareas) distintas para un mismo vector.
# Queremos la media de nuestros números y la media de estos transformados a logaritmo
vector <- seq(1, 100, 10)
mean (log (vector))[1] 3.380067
# Queremos la desviación estándar de nuestros números y de éstos transformados a log
vector2 <- seq(1, 300, 50)
mean (log (vector2))[1] 4.065497
# Una función que hace todo eso a la vez y más cosas
log_vect <- function (y) {
mean <- mean (y)
mean_log <- mean (log (y+1))
sd <- sd (y)
sd_log <- sd (log (y+1))
return(c(mean, mean_log, sd, sd_log))
}
vector3 <- sample (40)
log_vect (vector3)[1] 20.5000000 2.8508553 11.6904519 0.7631147
[1] "Aquí está el número 1"
[1] "Aquí está el número 2"
[1] "Aquí está el número 3"
[1] "Aquí está el número 4"
[1] "Aquí está el número 5"
[1] 2.397895
[1] 3.044522
[1] 3.433987
[1] 3.713572
Imaginemos que queremos tirar un dado
Queremos repetir la función anterior 100 veces (tirar el dado 100 veces)
🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲🎲 x 100
# Hay que generar un objeto vacío
tiro <- c()
for (i in 1:100) {
tiro[[i]] <- sample(1:6, 1)
}
unlist(tiro) [1] 6 4 4 4 2 1 3 6 3 1 3 2 6 1 2 4 4 6 6 3 4 4 6 6 2 3 1 4 4 3 1 5 2 1 1 3 6
[38] 2 5 6 3 2 1 6 5 2 6 3 4 2 6 5 6 5 5 5 1 1 6 2 1 1 2 3 1 1 6 6 6 4 3 5 6 5
[75] 1 2 5 3 3 2 3 4 4 6 4 3 3 2 5 6 4 3 4 1 2 5 6 4 1 3
Genera un objeto que contenga 100 medias de 50 valores aleatorios generados a partir de una distribucion normal
Genera un objeto que contenga 100 medias de 50 valores aleatorios generados a partir de una distribucion normal
# Crear un vector vacío
filas <- c()
for (i in 1:100) {
filas[[i]] <- mean (rnorm (50))
}
unlist(filas) [1] 0.171929489 0.245928762 -0.383527225 -0.045886698 -0.145480655
[6] -0.153789257 0.019575533 0.149086952 0.024996695 -0.167519637
[11] 0.127836882 -0.087535186 0.118295599 -0.090252015 0.041646950
[16] -0.017311433 0.086045739 -0.026423466 0.084914744 -0.060076813
[21] 0.130925087 -0.021091693 0.181544998 -0.035309487 0.084173985
[26] -0.360209360 0.083973333 0.085053601 0.265471841 -0.017913465
[31] -0.190312276 0.034157471 0.025087809 0.026103575 0.019677156
[36] 0.017245827 -0.010712230 -0.018403923 0.144229092 -0.061774450
[41] 0.094219891 -0.067379640 -0.077963159 -0.045919603 0.058185731
[46] 0.003658610 0.019328991 0.204302690 0.132257466 -0.187453957
[51] 0.168277920 -0.021446373 -0.183940109 -0.032098545 -0.161062078
[56] 0.030369617 0.214567311 -0.204383711 -0.066557884 0.074916997
[61] 0.202646142 -0.078461092 -0.133101024 0.133060152 -0.121591318
[66] -0.053943708 -0.083650419 0.209885062 0.145781818 -0.117234927
[71] -0.084106973 -0.089786776 0.128450362 -0.047819492 0.156103445
[76] 0.100697303 0.305958682 0.008168264 0.135146136 -0.137245035
[81] 0.202612753 -0.178228877 -0.055143678 0.125963594 0.201446381
[86] 0.101824491 -0.166018820 0.118488789 -0.295004739 -0.058933192
[91] 0.121472453 0.088904124 -0.018568124 0.103419325 0.053311042
[96] 0.221767274 -0.132684828 0.219902434 -0.153576130 -0.114645591
Guardamos en un objeto las iteraciones
Otra forma de hacer bucles, pero en la misma linea
Crea un vector con 10 temperaturas y usa ifelse() para clasificar cada valor como “Frío” o “Caluroso”, según tu termostato personal
Opcional (y difícil). Haz una función que diga si un número cualquiera es par o no
Crea un vector con 10 temperaturas y usa ifelse() para clasificar cada valor como “Frío” o “Caluroso”, según tu termostato personal
Haz una función que diga si un número cualquiera es par o no
temperaturas <- rpois (10, 15)
clasificacion <- ifelse(temperaturas < 15, "frio", "caliente")
data.frame (temperaturas, clasificacion) temperaturas clasificacion
1 12 frio
2 15 caliente
3 15 caliente
4 15 caliente
5 12 frio
6 11 frio
7 13 frio
8 17 caliente
9 12 frio
10 18 caliente
que_tipo_de_numero_soy <- function (x) {
ifelse(x %% 2 == 0, "par", "impar")
}
que_tipo_de_numero_soy(2)[1] "par"
[1] "impar"
Una base de datos (data frame) es una tabla de datos, como una hoja de cálculo en excel, tiene filas (observaciones) y columnas (variables).
# Creamos vectores con información
nombres <- c ("Laura", "Rocio", "Violeta")
edad <- c(23, 35, 29)
altura <- c(1.65, 1.80, 1.70)
profesion <- c("Bióloga", "Informática", "Médica")
# Combinamos todo en un data frame
personas <- data.frame(
NAME = nombres,
AGE = edad,
HEIGHT = altura,
JOB = profesion)
personas NAME AGE HEIGHT JOB
1 Laura 23 1.65 Bióloga
2 Rocio 35 1.80 Informática
3 Violeta 29 1.70 Médica
Seleccionamos filas, columnas sobre la base de datos
objeto[filas,columnas]
NAME AGE HEIGHT JOB
1 Laura 23 1.65 Bióloga
[1] "Laura" "Rocio" "Violeta"
[1] "Laura" "Rocio" "Violeta"
tabla vista en R (View)
Organiza correctamente tus carpetas
En la práctica, los datos vienen en archivos externos: CSV, Excel, TXT, u online.
El formato .csv (comma separated values) es el más común. Cada columna está separada por una coma o punto y coma.
here () nos lleva a donde tengamos el archivo del script guardado
library(here)
# dir()
# getwd ()
# setwd ()
# CSV
datos_csv <- read.csv(here("data/personas.csv"))
head(datos_csv) NAME AGE HEIGHT JOB
1 Laura 23 1.65 Bióloga
2 Rocio 35 1.80 Profesora
3 Violeta 29 1.70 Médica
# EXCEL
library(readxl)
datos_excel <- read_excel(here("data/herbarium_df.xlsx")) #, sheet = 1 podríamos especificar el numero de hoja
# GOOGLE SHEETS
library(googlesheets4)
datos_gs <- read_sheet("https://docs.google.com/spreadsheets/d/1qC4lsXPpEcX1NmLdwiMJMC8X_WKX-EFQm4ahPdrNCZc/edit?usp=sharing")Base de datos de flores: Por cada sitio y trampa, tenemos el numero de flores que tienen las especies de plantas en Doñana.
Ejercicio: Importa la base de datos “flores.csv” de la carpeta “data”, explora la base de datos, calcula la abundancia media de flores total, indica cuantas especies distintas hay de plantas. Luego, crea una base de datos con el número de individuos por especie (no de flores). Guardala como csv.
'data.frame': 490 obs. of 5 variables:
$ code : int 1 2 3 4 5 6 7 8 9 10 ...
$ site_id : chr "ANZ_1" "ANZ_1" "ANZ_1" "ANZ_1" ...
$ pantrap : int 1 1 1 2 2 2 2 3 3 4 ...
$ species : chr "Oxalis pes-caprae" "Cistus salvifolius" "Ornithogalum umbellatum" "Cistus salvifolius" ...
$ abundance: int 3 16 4 2 3 4 1 3 1 8 ...
[1] 16.45102
[1] 74